import json
import random
import re

from flask import Blueprint, request, jsonify
# 密码加密
from werkzeug.security import generate_password_hash

from conf.comm import sqlalchemy_context
from database import *
from utils.comm import send_message
from utils.redisconn import r

# 蓝图初始化
bp_users = Blueprint('users', __name__)


# 注册功能实现
@bp_users.route('/reg', methods=['POST'])
@sqlalchemy_context()
def reg():
    # 获取用户输入
    data = request.data
    if not data:
        data = request.form
    else:
        data = json.loads(data)
    # 有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$', data['mobile'])
    if not reg:
        return jsonify({"code": 10012, 'mes': '手机号不合法'})
    # 构造user
    try:
        user = User(username=data['username'], password=generate_password_hash(data['password']), mobile=data['mobile'])
        db.session.add(user)
        db.session.commit()
        return jsonify({"code": 200})
    except:
        return jsonify({"code": 10010})

    # 发送验证码


@bp_users.route('/sendsms', methods=['POST'])
def sendsms():
    # 传递手机号
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    # 有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$', data['mobile'])
    if not reg:
        return jsonify({"code": 10012, 'mes': '手机号不合法'})
    # 生成验证码
    code = str(random.randint(100000, 999999))
    # 调用短信接口
    flag = send_message(mobile, code, 1)
    if flag:
        # 发送成功，存入redis
        r.set_str(mobile, code, 60)
        # 返回结果（验证码）
        return jsonify({'code': 200, 'smscode': code})
    else:
        return jsonify({'code': 20011, 'mes': '发送失败，请重试'})


@bp_users.route('/login', methods=['POST'])
def login():
    # 获取用户输入
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    # 用户输入的验证码
    code = data['code']
    # 通过手机号redis查
    rcode = r.get_str(mobile)
    # 存在值对比-》
    if rcode:
        if int(code) == int(rcode):
            # 用手机号生成一个新用户
            user = User.query.filter_by(mobile=mobile).first()
            # 用户不存在添加
            if not user:
                user = User(username=mobile, mobile=mobile)
                db.session.add(user)
                db.session.commit()
                # 清除redis
            r.del_str(mobile)
            # 返回结果（pyjwt生成token）
            return jsonify({"code": 200, 'userid': user.id, 'username': user.username})
        else:
            # 不存在返回
            return jsonify({"code": 20013, 'mes': '验证码错误，请重新输入'})
    else:
        # 不存在返回
        return jsonify({"code": 20012, 'mes': '验证码不存在，请重新发送'})
